<?php

class Doctrine_Template_Commentable extends Doctrine_Template {

 	public function setTableDefinition()
  	{
    	$this->addListener(new Doctrine_Template_Listener_Commentable($this->_options));
  	}
  	
  	/**
  	 * 
  	 * Событие добавления комментария
  	 * @param Default_Model_Comment $comment
  	 */
  	public function addComment(Default_Model_Comment $comment) {
  		$comment->set('record_model', $this->_invoker->getTable()->getComponentName());
  		$comment->set('record_id', $this->_invoker->get('id'));
  		$comment->save();
  		
  		return $this->_invoker;
  	}
  	
  	/**
  	 * 
  	 * Получить количество комментариев
  	 * @param boolean $onlyActiveComments true только активные комменты
  	 */
  	public function getNbComments($onlyActiveComments = true) {
  		return $this->getCommentsQuery($onlyActiveComments)->count();
  	}
  	
  	/**
  	 * 
  	 * Имеются ли комментарии
  	 * @param boolean $onlyActiveComments true только активные комменты
  	 */
  	public function hasComments($onlyActiveComments = true) {
  		return $this->getNbComments($onlyActiveComments) > 0;
  	}
  	
  	/**
  	 * 
  	 * Получить активные комментарии
  	 * @return Doctrine_Collection записи активных комментариев
  	 */
  	public function getComments() {
  		return $this->getCommentsQuery(true)->execute();
  	}
  	
  	/**
  	 * 
  	 * Получить все комментарии в том числе неактивные
  	 */
  	public function getAllComments() {
  		return $this->getCommentsQuery(false)->execute();
  	}
  	
  	/**
  	 * 
  	 * Собирает запрос на получение комментариев
  	 * @param boolean $onlyActiveComments true брать только активные комментарии
  	 */
  	public function getCommentsQuery($onlyActiveComments = true) {
  		$query = Doctrine_Query::create()
  				 ->from('Default_Model_Comment')
  				 ->where('record_model = ?', $this->_invoker->getTable()->getComponentName())
  				 ->andWhere('record_id = ?', $this->_invoker->get('id'))
  				 ->orderBy('created_at ASC');
  				 
  		if($onlyActiveComments) {
  			$query->andWhere('is_active = ?', true);
  		}
  		
  		return $query;
  	}
}